iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 23
0
Modern Web

Go into Web!系列 第 23

Day 23 | 自己測一下程式好嗎?淺入單元測試(一)

  • 分享至 

  • xImage
  •  

常常看到電視節目中會有許多的社會實驗,通過各種不同的情境測試來測試人的反應如何,從這樣的測試中就可以看出不同人的人品如何,可以通過測試來驗證人品,當然也可以通過測試來驗證軟體品質。

軟體的品質要好,就是要可以通過各式各樣情境的測試,不管是正常的測試或是故意輸入錯誤的參數等等,可以通過驗證的軟體才是好的軟體。

一般我們在開發的時候都會透過 debug 測試功能與參數是否有誤,但是我們可以思考看看,當 A功能 完成開發了,後續在開發 B功能 時,B功能 的程式有可能會影響到 A功能的結果,但這時候我們不可能每次都重新去手動測試以前寫完的程式功能是否有誤,這時候 單元測試 就顯得格外的重要了,今天就讓我們好好來聊聊單元測試吧!

什麼是單元測試

單元測試是從英文的 Unit Test 所翻譯過來的,所謂的 Unit 就是最小的單位,在程式裡面可以當作是 方法類別,因此單元測試基本上為測試我們在程式裡面撰寫的每個方法及類別邏輯是否正確。

範例

檔案命名

在 Go 中寫單元測試,基本上就是將測試檔案放在與要被測試的程式檔相同資料夾底下,單元測試檔案名稱為 測試檔名_test.go,例如我們有一個檔案名為 cal.go,那麼對於這個檔案的單元測試檔就為 cal_test.go

程式檔

首先,我們有一個名為 cal 的 package 裡面包含著 Add 方法,並且儲存為 cal.go

package cal

func Add(x, y int) int {
	return x + y
}

測試檔

我們要對 Add 這個方法撰寫單元測試,首先我們先編輯 cal_test.go,定義好 package 名稱與測試方法,由於 Go 原生就有提供測試方法,因此只要將 testing 進行 import 即可。

package cal

import (
	"testing"
)

接著我們要撰寫測試案例,通常我會定義好 inputoutput,就是與先設定好輸入什麼參數會有什麼結果。

var (
	input = [][]int{
		{1, 2},
		{2, 3},
		{3, 4},
	}
	output = []int{3, 5, 7}
)

定義好測試案例後,接著來到今天的主軸,我們對 Add 方法進行單元測試,因此檔名我們命名為 TestAdd,這邊會有 *testing.T 當作參數,這邊提供了有 Log 方法與 Error 方法。

我們將測試案例用迴圈一個一個測試,測試不過就透過 Error 方法拋出錯誤。

func TestAdd(t *testing.T) {
	for i, in := range input {
		result := Add(in[0], in[1])
		t.Log("in =", in, "output should be", output[i], " actual output equal", result)
		if output[i] == result {
			t.Log("Pass")
		} else {
			t.Error("Case", i, "is failed")
		}
	}
}

以上這樣就完成了一個基本的單元測試拉!

測試

最後我們可以透過 go test -v 的指令做單元測試,測試結果如下

=== RUN   TestAdd
    TestAdd: cal_test.go:19: in = [1 2] output should be 3  actual output equal 3
    TestAdd: cal_test.go:21: Pass
    TestAdd: cal_test.go:19: in = [2 3] output should be 5  actual output equal 5
    TestAdd: cal_test.go:21: Pass
    TestAdd: cal_test.go:19: in = [3 4] output should be 7  actual output equal 7
    TestAdd: cal_test.go:21: Pass
--- PASS: TestAdd (0.00s)
PASS
ok      anonymous_chat/cal   0.098s

如果想要看到單元測試的 覆蓋率,可以加入 -cover 參數,結果如下

=== RUN   TestAdd
    TestAdd: cal_test.go:19: in = [1 2] output should be 3  actual output equal 3
    TestAdd: cal_test.go:21: Pass
    TestAdd: cal_test.go:19: in = [2 3] output should be 5  actual output equal 5
    TestAdd: cal_test.go:21: Pass
    TestAdd: cal_test.go:19: in = [3 4] output should be 7  actual output equal 7
    TestAdd: cal_test.go:21: Pass
--- PASS: TestAdd (0.00s)
PASS
coverage: 100.0% of statements
ok      anonymous_chat/cal    0.171s

這樣就完成了簡單的單元測試拉

小結

單元測試對於軟體品質是不可或缺的一環,基本上在開發的過程中會要求單元是的覆蓋率至少要達到 80% 以上,這樣才能確保程式每次的輸出的結果不會有問題。


上一篇
Day22 | 結合 Redis 實作隨機一對一匿名聊天室
下一篇
Day 24 | 自己測一下程式好嗎?淺入單元測試(二)
系列文
Go into Web!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言